# ifndef CONEXIONLDAP_H_
# define CONEXIONLDAP_H_

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <iostream>
#include <sstream>
#include <unistd.h>
#include <lber.h>
#include <ldap.h>
#include <sys/time.h>
#include "Conexion.h"


using namespace std;

#define LD_NO_INICIALIZADO 10
#define NO_HAY_SESION 11

class ConexionLDAP: public Conexion{

private:

	LDAP* ld;

	bool enSesion;

	bool seguir;

	int operacion;

public:

	ConexionLDAP(int id, char* host, int port = LDAP_PORT);	


	void agregarAtributoSimple(LDAPMod* att, int op, CampoConfigurableSimple campoSimple);

	void agregarAtributoMulti(LDAPMod* att, int op, CampoConfigurableMulti campoMulti);

	//crea la conexión al servidor LDAP
	void inicializar(char* host, int port);

	~ConexionLDAP();

	//devuelve el id (único)
	int getId();

	//inicia una sesión
	int bind(char* user, char* pass);

	//cierra la sesión y la conexión
	int unbind();

	//busca a partir de base y en el rango scope los atributos marcados con atts según algún filtro
	int buscar(char* base, int scope,char* atts[]);

	//crea un filtro de búsqueda
	char* crearFiltro();

	//borra el objeto de dn dn
	int borrar(char* dn);

	//modifica los atributos de mods en el objeto de dn dn
	int modificar(char* dn, LDAPMod* mods[]);

	//agrega un nuevo objeto de dn dn con los atributos en atts
	int agregar(char* dn,LDAPMod* atts[]);

	//compara el valor del atributo attr del objeto de dn dn con value
	int comparar(char* dn,char* attr,char* value);

	//modifica el rdn del objeto de dn dn por newrdn
	int cambiarRDN(char* dn, char* newrdn);

	void insertar(Encolable* actual);

	void modificar(Encolable* actual);

	void eliminar(Encolable* actual);

	//cambiar la direccion del servidor LDAP
	void cambiarServer(char* nuevoHost, int nuevoPort);
};

#endif
